#include "myTime.h"
#include <time.h>
#include <sys/time.h>
#include "esp_sntp.h"
#include "esp_http_client.h"
#include "cJSON.h"

static const char *TAG = "ntp";
static struct tm timeinfo;

static void myTime_SNTP_Init(void)
{
    sntp_setoperatingmode(SNTP_OPMODE_POLL);    // 设置单播模式

    sntp_setservername(0, "cn.ntp.org.cn");	    // 设置访问服务器
    sntp_setservername(1, "ntp1.aliyun.com");
    sntp_setservername(2, "210.72.145.44");     // 国家授时中心服务器 IP 地址
    // sntp_setservername(3, "1.cn.pool.ntp.org");    
    // sntp_setservername(4, "cn.pool.ntp.org");	
    setenv("TZ", "CST-8", 1); 
    sntp_init();
}

void myTime_Task(void *param)
{
    myTime_SNTP_Init();
    ESP_LOGI(TAG, "my time sntp Initializing...");
    // 延时等待SNTP初始化完成
    do {
        vTaskDelay(100 / portTICK_PERIOD_MS);
    } while (sntp_get_sync_status() == SNTP_SYNC_STATUS_RESET);

    // 成功获取网络时间后停止NTP请求，不然设备重启后会造成获取网络时间失败的现象
    // 大概是服务器时根据心跳时间来删除客户端的，如果不是stop结束的客户端，下次连接服务器时就会出错
    sntp_stop();
    ESP_LOGI(TAG, "my time sntp finished.");

    time_t now;
    while(1) {
        time(&now);                         // 获取网络时间, 64bit的秒计数     
        tzset();                            // 更新本地C库时间
        localtime_r(&now, &timeinfo);       // 转换成具体的时间参数
        // strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo);
        // ESP_LOGI(TAG, "The current date/time in Shanghai is: %s", strftime_buf);
        ESP_LOGI(TAG, "%4d-%02d-%02d %02d:%02d:%02d week:%d", timeinfo.tm_year + 1900, timeinfo.tm_mon + 1, 
        timeinfo.tm_mday, timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec, timeinfo.tm_wday); 

        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}
